package com.ruoyi.store.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageHelper;
import com.ruoyi.common.exception.CustomException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.core.page.PagePlus;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.ValidateFormUtil;
import com.ruoyi.store.bo.*;
import com.ruoyi.store.vo.HmSystemConfigFormItemConfigRegListVo;
import com.ruoyi.store.vo.HmSystemConfigFormItemVo;
import com.ruoyi.store.vo.HmSystemConfigFormVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.store.domain.HmSystemFormTemp;
import com.ruoyi.store.mapper.HmSystemFormTempMapper;
import com.ruoyi.store.vo.HmSystemFormTempVo;
import com.ruoyi.store.service.IHmSystemFormTempService;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Collection;

/**
 * 表单配置Service业务层处理
 *
 * @author ruoyi
 * @date 2021-07-04
 */
@Service
public class HmSystemFormTempServiceImpl extends ServicePlusImpl<HmSystemFormTempMapper, HmSystemFormTemp> implements IHmSystemFormTempService {
	@Resource
	private HmSystemFormTempMapper dao;

	@Override
	public HmSystemFormTempVo queryById(Long id){
		return getVoById(id, HmSystemFormTempVo.class);
	}

	@Override
	public TableDataInfo<HmSystemFormTempVo> queryPageList(HmSystemFormTempQueryBo bo) {
		PagePlus<HmSystemFormTemp, HmSystemFormTempVo> result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo), HmSystemFormTempVo.class);
		return PageUtils.buildDataInfo(result);
	}

	@Override
	public List<HmSystemFormTempVo> queryList(HmSystemFormTempQueryBo bo) {
		return listVo(buildQueryWrapper(bo), HmSystemFormTempVo.class);
	}

	private LambdaQueryWrapper<HmSystemFormTemp> buildQueryWrapper(HmSystemFormTempQueryBo bo) {
		Map<String, Object> params = bo.getParams();
		LambdaQueryWrapper<HmSystemFormTemp> lqw = Wrappers.lambdaQuery();
		lqw.like(StrUtil.isNotBlank(bo.getName()), HmSystemFormTemp::getName, bo.getName());
		lqw.eq(StrUtil.isNotBlank(bo.getInfo()), HmSystemFormTemp::getInfo, bo.getInfo());
		lqw.eq(StrUtil.isNotBlank(bo.getContent()), HmSystemFormTemp::getContent, bo.getContent());
		return lqw;
	}

	@Override
	public Boolean insertByAddBo(HmSystemFormTempAddBo bo) {
		HmSystemFormTemp add = BeanUtil.toBean(bo, HmSystemFormTemp.class);
		validEntityBeforeSave(add);
		return save(add);
	}

	@Override
	public Boolean updateByEditBo(HmSystemFormTempEditBo bo) {
		bo.setUpdateTime(DateUtils.getNowDate());
		HmSystemFormTemp update = BeanUtil.toBean(bo, HmSystemFormTemp.class);
		validEntityBeforeSave(update);
		return updateById(update);
	}

	/**
	 * 保存前的数据校验
	 *
	 * @param entity 实体类数据
	 */
	private void validEntityBeforeSave(HmSystemFormTemp entity){
		//TODO 做一些数据校验,如唯一约束
	}

	@Override
	public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
		if(isValid){
			//TODO 做一些业务上的校验,判断是否需要校验
		}
		return removeByIds(ids);
	}
	/**
	 * 验证item规则
	 * @param systemFormCheckRequest SystemFormCheckRequest 表单数据提交
	 */
	@Override
	public void checkForm(HmSystemFormCheckBo systemFormCheckRequest){
		//循环取出item数据， 组合成 key => val 的map格式
		HashMap<String, String> map = new HashMap<>();
		for (HmSystemFormItemCheckBo systemFormItemCheckRequest : systemFormCheckRequest.getFields()) {
			map.put(systemFormItemCheckRequest.getName(), systemFormItemCheckRequest.getValue());
		}

		//取出表单模型的数据
		HmSystemFormTemp formTemp = getById(systemFormCheckRequest.getId());


		//解析表单规则进行验证
		HmSystemConfigFormVo systemConfigFormVo;
		try{
			systemConfigFormVo =  JSONObject.parseObject(formTemp.getContent(), HmSystemConfigFormVo.class);
		}catch (Exception e){
			throw new CustomException("模板表单 【" + formTemp.getName() + "】 的内容不是正确的JSON格式！");
		}

		HmSystemConfigFormItemVo systemConfigFormItemVo;

		for (String item : systemConfigFormVo.getFields()) {

			systemConfigFormItemVo = JSONObject.parseObject(item, HmSystemConfigFormItemVo.class);
			String model = systemConfigFormItemVo.get__vModel__(); //字段 name

			if(systemConfigFormItemVo.get__config__().getRequired() && map.get(model).equals("")){
				throw new CustomException(systemConfigFormItemVo.get__config__().getLabel() + "不能为空！");
			}

			//正则验证
			checkRule(systemConfigFormItemVo.get__config__().getRegList(), map.get(model),  systemConfigFormItemVo.get__config__().getLabel());
		}
	}
	/**
	 * 验证item规则
	 * @param regList List<SystemConfigFormItemConfigRegListVo 正则表达式列表
	 * @param value String 验证的值
	 * @param name String 提示语字段名称
	 */
	private void checkRule(List<HmSystemConfigFormItemConfigRegListVo> regList, String value, String name){
		if(regList.size() > 0){
			for (HmSystemConfigFormItemConfigRegListVo systemConfigFormItemConfigRegListVo : regList) {
				if(!ValidateFormUtil.regular(value, name, systemConfigFormItemConfigRegListVo.getPattern())){
					throw new CustomException(systemConfigFormItemConfigRegListVo.getMessage());
				}
			}
		}
	}
}
